#ifndef FILE_UTIL_H
#define FILE_UTIL_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>  // getcwd()
#ifdef _WIN32
#define PATH_SEP "\\"
#else
#define PATH_SEP "/"
#endif

#define MAX_PATH_LEN 512

#include <cjson/cJSON.h>
#include <curl/curl.h>

// ✅基于文件存储的结构体数据持久化；
#define DATA_DIR "./data"
#define BD_CODE_JSON_PATH DATA_DIR "/bd_get_code_json.json"
#define BD_ACCESS_TOKEN_JSON_PATH DATA_DIR "/bd_get_access_token_json.json"
#define BD_INFO_JSON_PATH DATA_DIR "/bd_info_json.json"
#define BD_STORAGE_INFO_JSON_PATH DATA_DIR "/bd_storage_info_json.json"

/**
 * cjson对象序列化成字符串
 * @param json cJSON对象
 * @return json string字符串
 */
char *json_to_string(cJSON *json);

/**
 * 存储字符串到文件中
 * @param void
 * @return 专辑分类标签
 */
_Bool save_value_to_file(const char *filename, const char *value);

/**
 * 从文件读取存储的字符串到
 * @param filename 文件路径
 * @return char * 存储字符串
 */
char *read_from_file(const char *file_path);

/**
 * 判断文件是否存在
 * @param file_path 文件路径，例如："./assets/images/cymbal/cymbal_00.jpg";
 * @return bool 文件是否存在
 */
_Bool is_file_exist(const char *file_path);

/**
 * cjson对象序列化成字符串存储到文件内
 * @param filename 文件路径
 * @param json cJSON对象
 * @return 是否存储成功
 */
_Bool save_json_to_file(const char *filename, cJSON *json);
// 编译报错❌：未定义标识符 "bool"C/C++(20)
// 解决办法✅：将返回类型从bool改为_Bool，并#include <stdbool.h>

/**
 * ✅ 从文件中读取字符串反序列化回 cJSON 对象
 * @param file_path 文件路径，"./data/bd_storage_info_json.json"
 * @return cJSON对象
 */
cJSON *read_json_from_file(const char *file_path);

/**
 * 确保 DATA_DIR 存在，如果不存在则创建
 * 所有存储文件的文件夹都通过该方法确保创建存在，在main.c主函数执行该方法
 */
void ensure_data_dir_exists(void);


/**
 * 拼接项目根目录和 assets 内相对路径
 * @param relative_path 例如 "images/cymbal/cymbal_00.jpg"
 * @return 静态字符串指针，可直接用于 lv_image_set_src()
 */
char *get_asset_path(char *relative_path);

#endif // FILE_UTIL_H
